package cn.tedu.adminsystem.webapi.controller;

import cn.tedu.adminsystem.service.IAdmService;
import cn.tedu.adminsystem.webapi.security.LoginPrincipal;
import cn.tedu.community.commons.pojo.admin.dto.*;
import cn.tedu.community.commons.pojo.admin.vo.AdminListItemVO;
import cn.tedu.community.commons.pojo.admin.vo.AdminStandardVO;
import cn.tedu.community.commons.restful.JsonPage;
import cn.tedu.community.commons.restful.JsonResult;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.web.bind.annotation.*;
import springfox.documentation.annotations.ApiIgnore;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import java.util.List;

@Api(tags = "管理员控制器")
@RestController
@Slf4j
@RequestMapping("/admin")
public class AdminController {

    @Autowired
    private IAdmService service;

    @ApiOperation("管理员登录")
    @PostMapping("/login")
    public JsonResult<String> login(@Valid AdminLoginDTO loginDTO, HttpServletResponse response) {
        log.debug("开始处理【管理员登录】的请求，参数：{}", loginDTO);
        String jwt = service.login(loginDTO);
        log.debug("是否记住密码：{}",loginDTO.getAdmRem());
        if (jwt != null && loginDTO.getAdmRem()) {
            Cookie admName = new Cookie("admName",loginDTO.getAdmName());
            Cookie admPassword = new Cookie("admPassword",loginDTO.getAdmPassword());
            admName.setMaxAge(60*60*24*30);
            admPassword.setMaxAge(60*60*24*30);
            response.addCookie(admName);
            response.addCookie(admPassword);
            log.debug("添加cookie成功");
        }
        return JsonResult.ok(jwt);
    }

    @ApiOperation("管理员退出登录")
    @PostMapping("/logout")
    public JsonResult<Void> logout() {
        log.debug("开始处理【管理员退出登录】的请求，无参数");
        SecurityContextHolder.clearContext();
        log.debug("退出登录成功！");
        return JsonResult.ok();
    }

    @ApiOperation("查询当前管理员详情")
    @GetMapping("/currentAdmin")
    public JsonResult<AdminStandardVO> currentAdmin(@ApiIgnore @AuthenticationPrincipal LoginPrincipal principal) {
        //看一下security里正确的当前管理员
        log.debug("当事人：{}", principal);
        log.debug("当事人的ID：{}", principal.getId());
        log.debug("当事人的用户名：{}", principal.getUsername());
        log.debug("开始处理查询当前管理员详情");
        AdminStandardVO standard = service.getStandard();
        return JsonResult.ok(standard);
    }

    @ApiOperation("根据id查询当前管理员详情")
    @GetMapping("/getStandard/{id:[0-9]+}")
    public JsonResult<AdminStandardVO> getStandardById(@PathVariable Long id) {
        log.debug("开始处理根据id查询管理员详情：id是：{}",id);
        AdminStandardVO standard = service.getStandardById(id);
        return JsonResult.ok(standard);
    }

    @ApiOperation("添加管理员")
    @PreAuthorize("hasAnyAuthority('/com/admin/add-new')")
    @PostMapping("/addNew")
    public JsonResult<Void> addNew(@Valid AdminAddNewDTO addNewDTO) {
        log.debug("开始处理添加管理员业务，参数是：{}", addNewDTO);
        service.addNew(addNewDTO);
        return JsonResult.ok();
    }

    @ApiOperation("批量添加管理员")
    @PreAuthorize("hasAnyAuthority('/com/admin/add-new')")
    @PostMapping("/addNewBatch")
    public JsonResult<Void> addNewBatch(AdminAddNewDTO[] addNewDTO) {
        log.debug("开始处理添加管理员业务，参数是：{}", addNewDTO);
        service.insertBatch(addNewDTO);
        return JsonResult.ok();
    }

    @ApiOperation("根据id删除管理员")
    @PreAuthorize("hasAnyAuthority('/com/admin/delete')")
    @PostMapping("/{id:[0-9]+}/delete")
    public JsonResult<Void> deleteById(@PathVariable Long id) {
        log.debug("开始处理删除管理员业务，id是：{}", id);
        service.deleteById(id);
        return JsonResult.ok();
    }

    @ApiOperation("根据id批量删除管理员")
    @PreAuthorize("hasAnyAuthority('/com/admin/delete')")
    @PostMapping("/deleteIds")
    public JsonResult<Void> deleteIds(@RequestBody Long[] ids) {
        log.debug("开始处理批量删除管理员业务，id是：{}", ids);
        service.deleteIds(ids);
        return JsonResult.ok();
    }

    @ApiOperation("更新当前管理员密码")
    @PostMapping("/updatePass")
    public JsonResult<Void> updatePass(@Valid AdminUpdatePassDTO updatePassDTO){
        log.debug("开始处理修改当前管理员密码，参数是：{}", updatePassDTO);
        service.updatePass(updatePassDTO);
        return JsonResult.ok();
    }

    @ApiOperation("更新管理员")
    @PreAuthorize("hasAnyAuthority('/com/admin/update')")
    @PostMapping("/{id:[0-9]+}/update")
    public JsonResult<Void> update(@PathVariable Long id,
                                   @Valid AdminUpdateDTO updateDTO) {
        log.debug("开始处理更新管理员业务，参数是：{}", updateDTO);
        service.update(id, updateDTO);
        return JsonResult.ok();
    }

    @ApiOperation("更新当前管理员")
    @PostMapping("/updateCurrent")
    public JsonResult<Void> updateCurrent(@Valid AdminUpdateCurrentDTO currentDTO) {
        log.debug("开始处理更新当前管理员业务，参数是：{}", currentDTO);
        service.updateCurrent(currentDTO);
        return JsonResult.ok();
    }

    @ApiOperation("启用管理员")
    @PreAuthorize("hasAnyAuthority('/com/admin/update')")
    @PostMapping("/{id:[0-9]+}/enable")
    public JsonResult<Void> setEnable(@PathVariable Long id) {
        log.debug("开始处理启用管理员业务，id是：{}", id);
        service.setEnable(id);
        return JsonResult.ok();
    }

    @ApiOperation("禁用管理员")
    @PreAuthorize("hasAnyAuthority('/com/admin/update')")
    @PostMapping("/{id:[0-9]+}/disable")
    public JsonResult<Void> setDisable(@PathVariable Long id) {
        log.debug("开始处理禁用管理员业务，id是：{}", id);
        service.setDisable(id);
        return JsonResult.ok();
    }

    @ApiOperation("分页查询管理员列表")
    @PreAuthorize("hasAuthority('/com/admin/read')")
    @GetMapping("/{page:[0-9]+}/{pageSize:[0-9]+}/list")
    public JsonResult<JsonPage<AdminListItemVO>> list(@PathVariable Integer page,
                                                      @PathVariable Integer pageSize) {
        log.debug("开始处理分页管理员列表业务，页码是：{},每页条数是：{}",page,pageSize);
        JsonPage<AdminListItemVO> list = service.list(page, pageSize);
        return JsonResult.ok(list);
    }
}
